// Copyright Epic Games, Inc. All Rights Reserved.

#pragma once // 防止头文件重复包含

#include "CoreMinimal.h" // 核心最小化
#include "Input/AimAssistInputModifier.h" // 瞄准辅助输入修改器
#include "UObject/Interface.h" // 接口
#include "IAimAssistTargetInterface.generated.h" // 生成的头文件

USTRUCT(BlueprintType) // 蓝图类型结构体
struct FAimAssistTargetOptions // 瞄准辅助目标选项
{
    GENERATED_BODY() // 生成结构体主体
    
    FAimAssistTargetOptions() // 构造函数
        : bIsActive(true) // 是否活动
    {}

    /** 考虑此目标命中框时应使用的形状组件 */
    TWeakObjectPtr<UShapeComponent> TargetShapeComponent; // 目标形状组件（弱引用）

    /**
     * 与此目标关联的游戏标签，可用于过滤它。
     *
     * 如果玩家的瞄准辅助设置具有与这些匹配的任何标签，它将被排除。
     */
    UPROPERTY(BlueprintReadWrite, EditAnywhere) // 蓝图读写，可在任何地方编辑
    FGameplayTagContainer AssociatedTags; // 关联标签

    /** 此目标当前是否活动。如果为false，将不考虑用于瞄准辅助 */
    UPROPERTY(BlueprintReadWrite, EditAnywhere) // 蓝图读写，可在任何地方编辑
    uint8 bIsActive : 1; // 是否活动（位域）
};


UINTERFACE(MinimalAPI, meta = (CannotImplementInterfaceInBlueprint)) // 最小API接口，元数据指定不能在蓝图中实现
class UAimAssistTaget : public UInterface // 继承自UInterface
{
    GENERATED_BODY() // 生成类主体
};

/**
 * 用于定义瞄准辅助目标的形状以及让瞄准辅助管理器了解任何关联的游戏标签。
 * 
 * 当目标在玩家外准星的视野内时，将被考虑
 *
 * @see UAimAssistTargetComponent 以获取示例
 */
class IAimAssistTaget // 瞄准辅助目标接口
{
    GENERATED_BODY() // 生成类主体

public:
    /** 用此接口填充给定的目标数据。当目标在玩家视野内时将调用此方法 */
    virtual void GatherTargetOptions(OUT FAimAssistTargetOptions& TargetData) = 0; // 收集目标选项（纯虚函数）
};